home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
artemis
/
artsrc2
/
ginit.asm
< prev
next >
Wrap
Assembly Source File
|
1994-06-01
|
7KB
|
357 lines
; 私製ライブラリ・グラフィック篇
; (c) MATSUUCHI Ryosuke in Dec,1992
;
; ginit.asm : 初期化
;
; 1992. 6.11 ... 6.13
; 1992.12.28(Sun)
.386p
public _ginit, ginit, _egbwork
public _callEGB, __SetVramSeg
public __AddVramBase_ebx
public __AddVramBase_esi
public __AddVramBase_edi
public __getpadrs
public __getpscrmod
public _egbwork, _scrmod, _wrtpage, _nowscrmod
public _vscrbase, _vscrmod
public _gramscr, gramscr
extrn EGB_work : dword
assume cs:cseg, ds:dseg
dseg segment dword 'DATA'
align 4
__dmy__ db 4 dup (0)
_egbwork db 1536 dup (0) ;EGBライブラリ用ワークエリア
_scrmod dd 0 ;ページ0の画面モード
dd 0 ;ページ1の画面モード
_vscrmod dd 0,0,0,0 ;仮想画面(0~3)の画面モード
_vscrbase dd 0,0,0,0 ;仮想画面(0~3)のベースオフセット
_nowscrmod dd 0 ;現在ページの画面モード
_wrtpage dd 0 ;現在の書き込みページ番号
;(bit7=1 なら、仮想画面を意味する)
__scrbase dd 0,40000h ;実画面各ページのベースオフセット
__scrsel dd 104h,104h,104h ;各画面モードのセレクタ値
dd 104h,104h,104h
dd 104h,104h,104h
dd 104h,104h,104h
dd 10ch,10ch,10ch
dd 10ch,10ch,10ch
dd 10ch,10ch,10ch
dseg ends
cseg segment dword 'CODE'
;---------------------------------------------------------------
; _callEGB : グラフィックBIOSの呼び出し
; in AH 機能コード
; DS:ESI パラメータ領域のアドレス
;---------------------------------------------------------------
align 4
_callEGB proc
push edi
push ds
pop gs
mov edi,offset _egbwork
push dword ptr 0110h
pop fs
call pword ptr fs:[20h]
pop edi
ret
_callEGB endp
;---------------------------------------------------------------
; _ginit : Rio's Graphic Library の初期化
; in none
; out none
;
; void ginit()
;---------------------------------------------------------------
ginit proc near
_ginit:
push eax
push ecx
xor ax,ax
mov ecx,1536
call _callEGB
mov eax,3
mov [_nowscrmod],eax
mov [_scrmod+0],eax
mov [_scrmod+4],eax
xor al,al
mov byte ptr [_wrtpage],al
mov eax,offset _egbwork
mov [EGB_work],eax
pop ecx
pop eax
ret
ginit endp
;-------------------------------------------------------------------------
; __setvramseg : es を、現在の書き込みページのセグメントに設定する
; ※(私製ライブラリの内部ルーチン)
; in none
; out none
; reg es
;-------------------------------------------------------------------------
__SetVramSeg proc near
push eax
mov eax,[_wrtpage]
bt eax,7
jc #vscr
;実画面の場合
mov eax,[_scrmod + eax*4]
cmp eax,11
jg #1
mov eax,104h ;モード 1~11: セレクタ 104h
jmp #2
#1:
mov eax,10ch ;モード 12~ : セレクタ 10Ch
#2:
mov es,ax
jmp #end
#vscr:
;仮想画面の場合 : 単に es←ds を行うだけ
push ds
pop es
#end:
pop eax
ret
__SetVramSeg endp
;-------------------------------------------------------------------------
; __AddVramBase_ebx
; ebx に、現在の書き込みページのベースオフセットを加算する
; (私製ライブラリの内部ルーチン)
; in none
; out none
; reg ebx
;-------------------------------------------------------------------------
__AddVramBase_ebx proc near
push eax
mov eax,[_wrtpage]
bt eax,7
jc #0
or eax,eax
jz #1
add ebx,40000h
#1:
jmp #2
#0:
and eax,7fh
add ebx,[_vscrbase + eax*4]
#2:
pop eax
ret
__AddVramBase_ebx endp
;-------------------------------------------------------------------------
; __AddVramBase_edi
; edi に、現在の書き込みページのベースオフセットを加算する
; (私製ライブラリの内部ルーチン)
; in none
; out none
; reg ebx
;-------------------------------------------------------------------------
__AddVramBase_edi proc near
push eax
mov eax,[_wrtpage]
bt eax,7
jc #0
or eax,eax
jz #1
add edi,40000h
#1:
jmp #2
#0:
and eax,7fh
add edi,[_vscrbase + eax*4]
#2:
pop eax
ret
__AddVramBase_edi endp
;-------------------------------------------------------------------------
; __AddVramBase_esi
; esi に、現在の書き込みページのベースオフセットを加算する
; (私製ライブラリの内部ルーチン)
; in none
; out none
; reg ebx
;-------------------------------------------------------------------------
__AddVramBase_esi proc near
push eax
mov eax,[_wrtpage]
bt eax,7
jc #0
or eax,eax
jz #1
add esi,40000h
#1:
jmp #2
#0:
and eax,7fh
add esi,[_vscrbase + eax*4]
#2:
pop eax
ret
__AddVramBase_esi endp
;-------------------------------------------------------------------------
; __getpscrmod
; 指定ページの画面モードを得る
; (私製ライブラリの内部ルーチン)
; in eax : ページ(bit7=1 → 仮想画面)
; out eax : 画面モード
;-------------------------------------------------------------------------
__getpscrmod proc near
bt eax,7
jc #0
mov eax,[_scrmod + eax*4] ;eax ← 画面モード
ret
#0: and eax,7fh
mov eax,[_vscrmod + eax*4]
ret
__getpscrmod endp
;-------------------------------------------------------------------------
; __getpadrs
; 指定ページの指定座標のアドレスのセレクタとオフセットを得る
; (私製ライブラリの内部ルーチン)
; in eax : ページ(bit7=1 → 仮想画面)
; ebx,ecx : 座標
; out eax : セレクタ
; ebx : オフセット
; reg eax,ebx
;-------------------------------------------------------------------------
__getpadrs proc near
push edx
push esi
push edi
bt eax,7
jc #0
;(実画面ページの場合)
mov edi,[__scrbase + eax*4] ;edi ←ベースオフセット
mov eax,[_scrmod + eax*4] ;eax ← 画面モード
mov edx,[__scrsel + eax*4] ;edx ← セレクタ
jmp #1
#0:
;(仮想画面ページの場合)
and eax,7fh
mov edi,[_vscrbase+eax*4] ;edi ←ベースオフセット
mov eax,[_vscrmod+eax*4] ;eax ←画面モード
sub edx,edx ;edx ←セレクタ
mov dx,ds
#1:
cmp eax,4
jg #2
;画面モード3~4の場合(1~2は無視)
mov esi,ecx ;esi=y*512+(x/2)
shl esi,9
mov eax,ebx
shr eax,1
add esi,eax
jmp #3
#2:
cmp eax,8
jg #4
;画面モード5~8の場合
mov esi,ecx ;edi=y*512+x*2
shl esi,9
lea esi,[esi+ebx*2]
jmp #3
#4:
cmp eax,11
jg #5
;画面モード9~11の場合
mov esi,ecx ;esi=y*1024+x*2
shl esi,10
lea esi,[esi+ebx*2]
jmp #3
#5:
cmp eax,14
jg #6
;画面モード12~14の場合
mov esi,ecx ;esi=y*1024+x
shl esi,10
add esi,ebx
jmp #3
#6:
;画面モード15~の場合
mov esi,ecx
shl esi,10
lea esi,[esi+ebx*2]
#3:
add edi,esi
mov ebx,edi
mov eax,edx
pop edi
pop esi
pop edx
ret
__getpadrs endp
;---------------------------------------------------------------
; _gramscr : 仮想画面の設定
; in eax : 設定する仮想画面ページ (0x80 | page)
; ebx : どの画面モードにするか
; ecx : 画面バッファへのポインタ (256K / 512K bytes)
; void gramscr(page, mode, buf)
;---------------------------------------------------------------
_gramscr proc
push eax
and eax,7fh
mov [_vscrmod+eax*4],ebx
mov [_vscrbase+eax*4],ecx
pop eax
ret
_gramscr endp
gramscr proc
push ebx
#para equ 8
mov eax,[esp+#para+0]
mov ebx,[esp+#para+4]
mov ecx,[esp+#para+8]
call _gramscr
pop ebx
ret
gramscr endp
cseg ends
end